use super::*;

const TESSERACT_BIN: &str = "tesseract";

pub static CMD_CHECK_TESSERACT: PrequireCmd = PrequireCmd::new(
  TESSERACT_BIN,
  "--version",
  Some(Link::new(
    "安装 TESSERACT",
    "https://github.com/tesseract-ocr/tessdoc/blob/main/Installation.md",
  )),
  Some(formatcp!(
    "Not found {0}!!\nPlease install {0} first.",
    TESSERACT_BIN
  )),
);

pub struct MakeBoxCmd<'a> {
  tiff_file: &'a str,
  box_file: &'a str,
  dpi: usize,

  // 0 僅限方向和腳本檢測 (OSD)。
  // 1 帶有 OSD 的自動頁面分割。
  // 2 自動頁面分割，但沒有 OSD 或 OCR。
  // 3 全自動分頁，但無OSD。 （默認）
  // 4 假設有一列大小可變的文本。
  // 5 假設有一個統一的垂直對齊文本塊。
  // 6 假設有一個統一的文本塊。(網路上教學常用)
  // 7 將圖像視為單個文本行。
  // 8 將圖像視為一個詞。
  // 9 將圖像視為圓圈中的單個單詞。
  // 10 將圖像視為單個字符。
  // 11 稀疏文本。尽可能多地查找没有特定顺序的文本。 
  // 12 带有 OSD 的稀疏文本。 
  // 13 原始线。将图像视为单个文本行， 绕过特定于 Tesseract 的黑客攻击。
  psm: usize, // 0-13

  // 0 Legacy engine only.
  // 1 Neural nets LSTM engine only.
  // 2 Legacy + LSTM engines.
  // 3 Default, based on what is available.
  // oem: usize, 
}

impl<'a> MakeBoxCmd<'a> {
  pub fn new(tiff_file: &'a str, box_file: &'a str, dpi: usize, psm: usize/* oem: usize*/) -> Self {
    MakeBoxCmd {
      tiff_file,
      box_file,
      dpi,
      psm,
      // oem,
    }
  }
}

impl<'a> BinaryCommand for MakeBoxCmd<'a> {
  type Output = ();
  fn exec(&self) -> Self::Output {
    if cfg!(target_os = "windows") {
      panic!("no impl for windows!")
    } else {
      let output = Command::new(TESSERACT_BIN)
        .arg(self.tiff_file)
        .arg(self.box_file)
        .arg("-l")
        .arg("chi_sim")
        .arg("--dpi")
        .arg(self.dpi.to_string())
        .arg("--psm")
        .arg(self.psm.to_string())
        .arg("--oem")
        .arg(self.psm.to_string())
        .arg("batch.nochop")
        .arg("makebox")
        .output();
      self.process_stdout::<&str>(output, None, None);
    }
  }
}
